/*
 * AFrame (原 m_data) 的 scene 管理模块
 * @author Zdream
 * @since 0.2.0
 */

/*
 * 场景部分
 */
m_data.s = {
	/*
	 * 每个场景的入口函数合成的列表, 每个元素应该包含以下内容:
	 * {
	 *   "name": ..., // String, 场景或子场景的名称
	 *   "module": ..., // String, 必需, 属于哪个模块
	 *   "func": ..., // Function, 执行入口函数
	 *   "args": ... // Object, 可选, 执行需要用到的数据.
	 *			   // 这些数据可能从上面 loadFuncs 中配置, 或者前面的场景传递.
	 * }
	 */
	scenes: [],

	/*
	 * 当前场景在 scenes 中的索引号
	 */
	curSceneIdx: -1,

	/*
	 * 当前场景已经执行了多少次 render 函数了
	 */
	curSceneCount: 0,

	/*
	 * 当前场景是否已经播放结束
	 */
	curSceneFin: true,

	/*
	 * 记录时间戳相关数据的对象
	 */
	timestamp : {
		// Integer, 每一个场景 (子场景) 的基准时间戳
		//		  即每个场景的第一帧的时间戳
		base : 0,
		// Integer, 现在离基准时间戳过去的时间, 单位毫秒
		duration : 0,
	},

	/*
	 * 重置.
	 * 当模块切换之后, 会调用它.
	 */
	reset: function() {
		this.scenes = [];
		this.curSceneIdx = -1;
		this.curSceneCount = 0;
		this.curSceneFin = true;
	},

	/**
	 * 询问当前场景是否已经播放完成
	 */
	isCurSceneFin: function() {
		return this.curSceneFin;
	},

	/**
	 * 切换场景
	 *
	 * @return
	 *   是否存在下一个场景
	 */
	switchScene: function() {
		this.curSceneCount = 0;
		this.curSceneIdx ++;
		m_data.curScene = this.scenes[this.curSceneIdx];
		this.curSceneFin = false;
		this.timestamp.base = this.curTime;
		this.timestamp.duration = 0;

		return m_data.curScene != null;
	},

	/**
	 * 播放当前场景
	 */
	play: function() {
		console.log("播放场景 #" + m_data.m.curModuleIdx + "-"
			+ this.curSceneIdx + ": " + m_data.curScene.name);
		m_data.e.release("play-scene", {index: this.curSceneIdx});
		
		// v0.1.1 发送开始播放信息
		this.sendPlayingStatus();
		
		m_data.curScene.func.call(m_data.curModule, m_data.curScene.args);
	},

	/**
	 * 向服务器端发送当前播放场景的信息
	 */
	sendPlayingStatus: function() {
		if (m_data.fSendStatus != null) {
			m_data.fSendStatus({
				status : "play-begin-one-scene",
				module : {
					index : m_data.m.curModuleIdx,
					name : m_data.curModule.name,
					length : m_data.m.moduleCount,
				},
				scene : {
					index : m_data.s.curSceneIdx,
					length : m_data.s.scenes.length,
				}
			});
		}
	}
}